package com.cencat.order.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.*;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalTime;

/**
 * 固定商家数据传输对象
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Data
@Accessors(chain = true)
public class MerchantDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 商家ID(更新时必填)
     */
    private Long merchantId;

    /**
     * 商家编号
     */
    @Size(max = 50, message = "商家编号长度不能超过50个字符")
    private String merchantCode;

    /**
     * 商家名称
     */
    @NotBlank(message = "商家名称不能为空")
    @Size(max = 100, message = "商家名称长度不能超过100个字符")
    private String merchantName;

    /**
     * 商家类型(1-餐饮 2-零售 3-医药 4-生鲜 5-其他)
     */
    @NotNull(message = "商家类型不能为空")
    @Min(value = 1, message = "商家类型值不正确")
    @Max(value = 5, message = "商家类型值不正确")
    private Integer merchantType;

    /**
     * 商家状态(0-禁用 1-启用 2-审核中 3-审核失败)
     */
    @Min(value = 0, message = "商家状态值不正确")
    @Max(value = 3, message = "商家状态值不正确")
    private Integer merchantStatus;

    /**
     * 营业执照号
     */
    @Size(max = 50, message = "营业执照号长度不能超过50个字符")
    private String businessLicenseNumber;

    /**
     * 营业执照照片
     */
    @Size(max = 500, message = "营业执照照片长度不能超过500个字符")
    private String businessLicensePhoto;

    /**
     * 法人姓名
     */
    @Size(max = 50, message = "法人姓名长度不能超过50个字符")
    private String legalPersonName;

    /**
     * 法人身份证号
     */
    @Pattern(regexp = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$", message = "法人身份证号格式不正确")
    private String legalPersonIdCard;

    /**
     * 法人身份证照片
     */
    @Size(max = 500, message = "法人身份证照片长度不能超过500个字符")
    private String legalPersonIdCardPhoto;

    /**
     * 联系人姓名
     */
    @NotBlank(message = "联系人姓名不能为空")
    @Size(max = 50, message = "联系人姓名长度不能超过50个字符")
    private String contactPersonName;

    /**
     * 联系人手机号
     */
    @NotBlank(message = "联系人手机号不能为空")
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "联系人手机号格式不正确")
    private String contactPersonPhone;

    /**
     * 联系人邮箱
     */
    @Email(message = "联系人邮箱格式不正确")
    @Size(max = 100, message = "联系人邮箱长度不能超过100个字符")
    private String contactPersonEmail;

    /**
     * 商家地址
     */
    @NotBlank(message = "商家地址不能为空")
    @Size(max = 200, message = "商家地址长度不能超过200个字符")
    private String merchantAddress;

    /**
     * 详细地址
     */
    @Size(max = 200, message = "详细地址长度不能超过200个字符")
    private String detailAddress;

    /**
     * 经度
     */
    @DecimalMin(value = "-180.0", message = "经度值不正确")
    @DecimalMax(value = "180.0", message = "经度值不正确")
    private BigDecimal longitude;

    /**
     * 纬度
     */
    @DecimalMin(value = "-90.0", message = "纬度值不正确")
    @DecimalMax(value = "90.0", message = "纬度值不正确")
    private BigDecimal latitude;

    /**
     * 省份编码
     */
    @Size(max = 10, message = "省份编码长度不能超过10个字符")
    private String provinceCode;

    /**
     * 省份名称
     */
    @Size(max = 50, message = "省份名称长度不能超过50个字符")
    private String provinceName;

    /**
     * 城市编码
     */
    @Size(max = 10, message = "城市编码长度不能超过10个字符")
    private String cityCode;

    /**
     * 城市名称
     */
    @Size(max = 50, message = "城市名称长度不能超过50个字符")
    private String cityName;

    /**
     * 区县编码
     */
    @Size(max = 10, message = "区县编码长度不能超过10个字符")
    private String districtCode;

    /**
     * 区县名称
     */
    @Size(max = 50, message = "区县名称长度不能超过50个字符")
    private String districtName;

    /**
     * 营业开始时间
     */
    @JsonFormat(pattern = "HH:mm:ss")
    private LocalTime businessStartTime;

    /**
     * 营业结束时间
     */
    @JsonFormat(pattern = "HH:mm:ss")
    private LocalTime businessEndTime;

    /**
     * 是否24小时营业
     */
    private Boolean is24Hours;

    /**
     * 休息日(多个用逗号分隔，1-7表示周一到周日)
     */
    @Size(max = 20, message = "休息日长度不能超过20个字符")
    private String restDays;

    /**
     * 服务范围(公里)
     */
    @DecimalMin(value = "0.1", message = "服务范围不能小于0.1公里")
    @DecimalMax(value = "100.0", message = "服务范围不能大于100公里")
    private BigDecimal serviceRange;

    /**
     * 配送费
     */
    @DecimalMin(value = "0.0", message = "配送费不能小于0")
    private BigDecimal deliveryFee;

    /**
     * 起送金额
     */
    @DecimalMin(value = "0.0", message = "起送金额不能小于0")
    private BigDecimal minimumOrderAmount;

    /**
     * 免配送费金额
     */
    @DecimalMin(value = "0.0", message = "免配送费金额不能小于0")
    private BigDecimal freeDeliveryAmount;

    /**
     * 平均配送时间(分钟)
     */
    @Min(value = 1, message = "平均配送时间不能小于1分钟")
    @Max(value = 1440, message = "平均配送时间不能大于1天")
    private Integer averageDeliveryTime;

    /**
     * 商家评分
     */
    @DecimalMin(value = "0.0", message = "商家评分不能小于0")
    @DecimalMax(value = "5.0", message = "商家评分不能大于5")
    private BigDecimal merchantRating;

    /**
     * 评价数量
     */
    @Min(value = 0, message = "评价数量不能小于0")
    private Integer ratingCount;

    /**
     * 月订单量
     */
    @Min(value = 0, message = "月订单量不能小于0")
    private Integer monthlyOrderCount;

    /**
     * 总订单量
     */
    @Min(value = 0, message = "总订单量不能小于0")
    private Integer totalOrderCount;

    /**
     * 商家描述
     */
    @Size(max = 500, message = "商家描述长度不能超过500个字符")
    private String merchantDescription;

    /**
     * 商家logo
     */
    @Size(max = 500, message = "商家logo长度不能超过500个字符")
    private String merchantLogo;

    /**
     * 商家封面图
     */
    @Size(max = 500, message = "商家封面图长度不能超过500个字符")
    private String merchantCoverImage;

    /**
     * 商家相册(多张图片用逗号分隔)
     */
    @Size(max = 2000, message = "商家相册长度不能超过2000个字符")
    private String merchantAlbum;

    /**
     * 认证状态(0-未认证 1-认证中 2-已认证 3-认证失败)
     */
    @Min(value = 0, message = "认证状态值不正确")
    @Max(value = 3, message = "认证状态值不正确")
    private Integer certificationStatus;

    /**
     * 认证时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime certificationTime;

    /**
     * 认证失败原因
     */
    @Size(max = 500, message = "认证失败原因长度不能超过500个字符")
    private String certificationFailReason;

    /**
     * 绑定司机数量
     */
    @Min(value = 0, message = "绑定司机数量不能小于0")
    private Integer bindDriverCount;

    /**
     * 最大绑定司机数量
     */
    @Min(value = 1, message = "最大绑定司机数量不能小于1")
    @Max(value = 100, message = "最大绑定司机数量不能大于100")
    private Integer maxBindDriverCount;

    /**
     * 是否支持快捷下单
     */
    private Boolean supportQuickOrder;

    /**
     * 快捷下单配置
     */
    @Size(max = 1000, message = "快捷下单配置长度不能超过1000个字符")
    private String quickOrderConfig;

    /**
     * 结算方式(1-月结 2-周结 3-日结 4-实时结算)
     */
    @Min(value = 1, message = "结算方式值不正确")
    @Max(value = 4, message = "结算方式值不正确")
    private Integer settlementMethod;

    /**
     * 结算周期(天)
     */
    @Min(value = 1, message = "结算周期不能小于1天")
    @Max(value = 365, message = "结算周期不能大于365天")
    private Integer settlementCycle;

    /**
     * 银行账户名
     */
    @Size(max = 100, message = "银行账户名长度不能超过100个字符")
    private String bankAccountName;

    /**
     * 银行账号
     */
    @Size(max = 50, message = "银行账号长度不能超过50个字符")
    private String bankAccountNumber;

    /**
     * 开户银行
     */
    @Size(max = 100, message = "开户银行长度不能超过100个字符")
    private String bankName;

    /**
     * 银行支行
     */
    @Size(max = 100, message = "银行支行长度不能超过100个字符")
    private String bankBranch;

    /**
     * 税号
     */
    @Size(max = 50, message = "税号长度不能超过50个字符")
    private String taxNumber;

    /**
     * 开票地址
     */
    @Size(max = 200, message = "开票地址长度不能超过200个字符")
    private String invoiceAddress;

    /**
     * 开票电话
     */
    @Size(max = 20, message = "开票电话长度不能超过20个字符")
    private String invoicePhone;

    /**
     * 特殊服务(多个用逗号分隔)
     */
    @Size(max = 200, message = "特殊服务长度不能超过200个字符")
    private String specialServices;

    /**
     * 配送区域(多个用逗号分隔)
     */
    @Size(max = 500, message = "配送区域长度不能超过500个字符")
    private String deliveryAreas;

    /**
     * 不配送区域(多个用逗号分隔)
     */
    @Size(max = 500, message = "不配送区域长度不能超过500个字符")
    private String nonDeliveryAreas;

    /**
     * 优惠活动
     */
    @Size(max = 1000, message = "优惠活动长度不能超过1000个字符")
    private String promotionActivities;

    /**
     * 是否启用推送通知
     */
    private Boolean enablePushNotification;

    /**
     * 推送通知配置
     */
    @Size(max = 1000, message = "推送通知配置长度不能超过1000个字符")
    private String pushNotificationConfig;

    /**
     * 是否启用短信通知
     */
    private Boolean enableSmsNotification;

    /**
     * 短信通知配置
     */
    @Size(max = 1000, message = "短信通知配置长度不能超过1000个字符")
    private String smsNotificationConfig;

    /**
     * 性能监控配置
     */
    @Size(max = 1000, message = "性能监控配置长度不能超过1000个字符")
    private String performanceMonitorConfig;

    /**
     * 系统设置
     */
    @Size(max = 2000, message = "系统设置长度不能超过2000个字符")
    private String systemSettings;

    /**
     * 最后登录时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime lastLoginTime;

    /**
     * 最后登录IP
     */
    @Size(max = 50, message = "最后登录IP长度不能超过50个字符")
    private String lastLoginIp;

    /**
     * 登录次数
     */
    @Min(value = 0, message = "登录次数不能小于0")
    private Integer loginCount;

    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    private String remark;

    /**
     * 扩展字段1
     */
    @Size(max = 200, message = "扩展字段1长度不能超过200个字符")
    private String extField1;

    /**
     * 扩展字段2
     */
    @Size(max = 200, message = "扩展字段2长度不能超过200个字符")
    private String extField2;

    /**
     * 扩展字段3
     */
    @Size(max = 200, message = "扩展字段3长度不能超过200个字符")
    private String extField3;
}